#include "ad.h"

static void AD_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(ADC_GPIO_CLK, ENABLE);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 设置为模拟输入
    GPIO_InitStructure.GPIO_Pin = ADC_GPIO_PINS;
    GPIO_Init(ADC_CPIO_PROT, &GPIO_InitStructure);
}

static void AD_Config(void)
{
    ADC_InitTypeDef ADC_InitStructure;

    RCC_APB2PeriphClockCmd(ADC_CLK, ENABLE);             // 使能ADC时钟
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);                    // 配置ADC时钟为PCLK2的六分频（72M/6 = 12MHz）

    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                  // 设置ADC工作在独立模式
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;              // 数据右对齐
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 禁用外部触发转换
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                 // 使用单次转换模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;                       // 禁用扫描转换模式
    ADC_InitStructure.ADC_NbrOfChannel = 1;                             // 设置转换通道数量为1
    ADC_Init(ADC, &ADC_InitStructure);

    ADC_Cmd(ADC, ENABLE); // 使能ADC

    ADC_ResetCalibration(ADC);                                     // 复位ADC的校准寄存器
    while (ADC_GetResetCalibrationStatus(ADC) == SET);             // 等待复位校准结束
    ADC_StartCalibration(ADC);                                     // 启动ADC的校准
    while (ADC_GetCalibrationStatus(ADC) == SET);                  // 等待校准完成
}

void AD_Init(void)
{
    AD_GPIO_Config();
    AD_Config();    
}

uint16_t AD_GetValue(uint8_t ADC_Channel)
{
    ADC_RegularChannelConfig(ADC, ADC_Channel, 1, ADC_SampleTime_55Cycles5); // 配置ADC的规则通道，采样时间为55.5个周期
    ADC_SoftwareStartConvCmd(ADC, ENABLE);                   // 启动ADC的软件转换
    while (ADC_GetFlagStatus(ADC, ADC_FLAG_EOC) == RESET);   // 等待转换结束标志位置位
    return ADC_GetConversionValue(ADC);                      // 获取ADC的转换值
}
